/****************************************************************************
 **
 ** Copyright (C) 2004-2005 Trolltech AS. All rights reserved.
 **
 ** This file is part of the documentation of the Qt Toolkit.
 **
 ** This file may be used under the terms of the GNU General Public
 ** License version 2.0 as published by the Free Software Foundation
 ** and appearing in the file LICENSE.GPL included in the packaging of
 ** this file.  Please review the following information to ensure GNU
 ** General Public Licensing requirements will be met:
 ** http://www.trolltech.com/products/qt/opensource.html
 **
 ** If you are unsure which license is appropriate for your use, please
 ** review the following information:
 ** http://www.trolltech.com/products/qt/licensing.html or contact the
 ** sales department at sales@trolltech.com.
 **
 ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
 ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 **
 ****************************************************************************/

#include <QtGui>

#include "dialog.h"

std::string botonesBusqueda[CANT_BOTONES] = {"Origen", "Destino", "Fecha",
    "Asunto"};

Dialog::Dialog() {
  setMinimumSize(QSize(800, 650));

  createMenu();
  createLoginGroupBox();
  createOperationGroupBox();
  createClassificationGroupBox();
  createSelectionGroupBox();
  createSearchGroupBox();
  createDiccionarioGroupBox();
  createDeleteGroupBox();

  bigEditor = new QTextEdit;
  bigEditor->setPlainText(tr("Almacenamiento de correos electronicos."));
  bigEditor->setReadOnly(true);

  okButton = new QPushButton(tr("Ayuda"));
  cancelButton = new QPushButton(tr("Salir"));
  okButton->setDefault(true);

  connect(okButton, SIGNAL(clicked()), this, SLOT(okClick()));
  connect(cancelButton, SIGNAL(clicked()), this, SLOT(reject()));

  connect(buttons[0], SIGNAL(clicked()), this, SLOT(resguardarClick()));
  connect(buttons[1], SIGNAL(clicked()), this, SLOT(configurarClick()));
  connect(buttons[2], SIGNAL(clicked()), this, SLOT(porIUCClick()));
  connect(buttons[3], SIGNAL(clicked()), this, SLOT(buscarClick()));
  connect(buttons[4], SIGNAL(clicked()), this, SLOT(mostrarDiccionarioClick()));
  connect(buttons[5], SIGNAL(clicked()), this, SLOT(buscarTerminoClick()));
  connect(buttons[6], SIGNAL(clicked()), this, SLOT(buscarFraseClick()));
  connect(buttons[7], SIGNAL(clicked()), this, SLOT(verClick()));
  connect(buttons[8], SIGNAL(clicked()), this, SLOT(borrarClick()));

  QHBoxLayout *buttonLayout = new QHBoxLayout;
  buttonLayout->addStretch(1);
  buttonLayout->addWidget(okButton);
  buttonLayout->addWidget(cancelButton);

  QVBoxLayout *mainLayout = new QVBoxLayout;
  mainLayout->setMenuBar(menuBar);
  mainLayout->addWidget(loginGroupBox);
  mainLayout->addWidget(operationGroupBox);
  mainLayout->addWidget(classificationGroupBox);
  mainLayout->addWidget(selectionGroupBox);
  mainLayout->addWidget(searchGroupBox);
  mainLayout->addWidget(diccionarioGroupBox);
  mainLayout->addWidget(deleteGroupBox);
  mainLayout->addWidget(bigEditor);
  mainLayout->addLayout(buttonLayout);
  setLayout(mainLayout);

  setWindowTitle(tr("Agente Brown"));
}

void Dialog::createMenu() {
  menuBar = new QMenuBar;

  fileMenu = new QMenu(tr("&File"), this);
  exitAction = fileMenu->addAction(tr("E&xit"));
  menuBar->addMenu(fileMenu);

  connect(exitAction, SIGNAL(triggered()), this, SLOT(accept()));
}

void Dialog::createOperationGroupBox() {
  operationGroupBox = new QGroupBox(tr("Comunicacion"));
  QHBoxLayout *layout = new QHBoxLayout;

  buttons[0] = new QPushButton(tr("Bajar mails"));
  layout->addWidget(buttons[0]);
  buttons[1] = new QPushButton(tr("Crear indices"));
  layout->addWidget(buttons[1]);

  operationGroupBox->setLayout(layout);
}

void Dialog::createLoginGroupBox() {
  loginGroupBox = new QGroupBox(tr("Acceso"));
  QHBoxLayout *layout = new QHBoxLayout;

  labels[0] = new QLabel(tr("Usuario:"));
  lineEdits[0] = new QLineEdit;
  layout->addWidget(labels[0]);
  layout->addWidget(lineEdits[0]);

  labels[1] = new QLabel(tr("Clave:"));
  lineEdits[1] = new QLineEdit;
  lineEdits[1]->setEchoMode( QLineEdit::Password );
  layout->addWidget(labels[1]);
  layout->addWidget(lineEdits[1]);

  loginGroupBox->setLayout(layout);
}

void Dialog::createSearchGroupBox() {
  searchGroupBox = new QGroupBox(tr("Busquedas / Indices a crear"));
  QHBoxLayout *layout = new QHBoxLayout;

  buttons[2] = new QPushButton(tr("Por IUC"));
    layout->addWidget(buttons[2]);
  buttons[3] = new QPushButton(tr("Buscar"));
  layout->addWidget(buttons[3]);
  lineEdits[2] = new QLineEdit;
  layout->addWidget(lineEdits[2]);

  searchGroupBox->setLayout(layout);
}

void Dialog::createDiccionarioGroupBox() {
  diccionarioGroupBox = new QGroupBox(tr("Diccionario de terminos"));
  QHBoxLayout *layout = new QHBoxLayout;

  buttons[4] = new QPushButton(tr("Mostrar diccionario"));
  layout->addWidget(buttons[4]);
  buttons[5] = new QPushButton(tr("Termino"));
  layout->addWidget(buttons[5]);
  buttons[6] = new QPushButton(tr("Frase"));
  layout->addWidget(buttons[6]);
  lineEdits[3] = new QLineEdit;
  layout->addWidget(lineEdits[3]);
  diccionarioGroupBox->setLayout(layout);
}

void Dialog::createDeleteGroupBox() {
  deleteGroupBox = new QGroupBox(tr("Ver/Borrar (ingresar lista de UIDs "
      "separados por espacio)"));
  QHBoxLayout *layout = new QHBoxLayout;

  buttons[7] = new QPushButton(tr("Ver"));
  layout->addWidget(buttons[7]);
  buttons[8] = new QPushButton(tr("Borrar"));
  layout->addWidget(buttons[8]);
  lineEdits[4] = new QLineEdit;
  layout->addWidget(lineEdits[4]);

  deleteGroupBox->setLayout(layout);
}

void Dialog::createClassificationGroupBox() {
  classificationGroupBox = new QGroupBox(tr("Clasificaciones"));
  QHBoxLayout *layout = new QHBoxLayout;

  QSignalMapper *signalMapper = new QSignalMapper(this);

  QString mensaje;
  for (int i = 0; i < CANT_BOTONES - 1; ++i) {
    buttons[i+13] = new QPushButton(tr(botonesBusqueda[i].c_str()));
    layout->addWidget(buttons[i+13]);
    mensaje.clear();
    mensaje.append("Clasificacion ");
    connect(buttons[i+13], SIGNAL(clicked()), signalMapper, SLOT(map()));
    signalMapper->setMapping(buttons[i+13], buttons[i+13]->text());
  }
  connect(signalMapper, SIGNAL(mapped(QString)), this, SLOT(clasificarClick(QString)));

  classificationGroupBox->setLayout(layout);
}

void Dialog::createSelectionGroupBox() {

  selectionGroupBox = new QGroupBox(tr("Selecciones"));
  QHBoxLayout *layout = new QHBoxLayout;

  QSignalMapper *signalMapper = new QSignalMapper(this);

  QString mensaje;
  for (int i = 0; i < CANT_BOTONES-1; ++i) {
    buttons[i+13] = new QPushButton(tr(botonesBusqueda[i].c_str()));
    layout->addWidget(buttons[i+13]);
    mensaje.clear();
    mensaje.append("Seleccion ");
    connect(buttons[i+13], SIGNAL(clicked()), signalMapper, SLOT(map()));
    signalMapper->setMapping(buttons[i+13], buttons[i+13]->text());
  }
  connect(signalMapper, SIGNAL(mapped(QString)), this, SLOT(seleccionarClick(QString)));

  selectionGroupBox->setLayout(layout);
}

/**
 * Metodos para ejecutar con cada click.
 */
void Dialog::okClick() {
  bigEditor->setText("Para buscar en indices de seleccion, ayudese con el "
      "boton que desee de \"Clasificaciones\".\nFormato: [DESTINO.usuario@dominio.com]");
  bigEditor->append("Para buscar en indices de clasificacion, ayudese con el "
      "boton que desee de \"Selecciones\".\nFormato: [FECHA=27*sep*2010]");
}

void Dialog::cancelClick() {
  exit;
}

void Dialog::porIUCClick() {
  QString tag;
  tag.append(lineEdits[2]->text());
  tag.append("[IUC=");
  tag.append("]");
  lineEdits[2]->setText(tag);
  bigEditor->setText("IMPORTANTE: Complete con valores separados por comas"
        " inmediatamente despues del igual su filtro por IUC.");
  bigEditor->append("Ej.: [IUC=15,20,83]");
}

void Dialog::buscarClick() {
  ManejadorInstrucciones mi;
  QString output;
  QString filtros;
  output.append("Filtros escogidos: ");
  filtros.append(lineEdits[2]->text());
  output.append(filtros);
  output += QString("\n");
  QString username;
  username.append(lineEdits[0]->text());
  QString userTrimeado = username.trimmed();
  QString password;
  password.append(lineEdits[1]->text());
  QString passwordTrimeado = password.trimmed();
  if (userTrimeado.isEmpty() || passwordTrimeado.isEmpty()) {
    bigEditor->setText("ATENCION! Debe ingresar su nombre de usuario y clave para buscar en indices.");
    return;
  }

  QString trimeada = filtros.trimmed();
  if (!trimeada.isEmpty()) {
    QStringList list2;
    if (trimeada.contains(";", Qt::CaseInsensitive)) {
      list2 = trimeada.split(";", QString::SkipEmptyParts);
      QString uno;
      for (int i = 0; i < list2.size(); i++) {
        uno += list2.at(i);
        uno += QString(" ");
      }
      if (uno.contains("[", Qt::CaseInsensitive)) {
        QString indice;
        indice += userTrimeado;
        indice += QString(" ");
        indice += QString("buscar");
        indice += QString(" ");
        indice += uno;
        output += mi.derivarBusquedas(indice);
        output += QString("\n");
      }
    } else {
      if (trimeada.contains("[", Qt::CaseInsensitive)) {
        QString indice;
        indice += userTrimeado;
        indice += QString(" ");
        indice += QString("buscar");
        indice += QString(" ");
        indice += trimeada;
        output += mi.derivarBusquedas(indice);
        output += QString("\n");
      }
    }
    bigEditor->setText(output);
  }
}

void Dialog::borrarClick() {
  ManejadorInstrucciones mi;
  QString listaUID;
  QString output;
  output.append("Mails a borrar (UIDs): ");
  listaUID.append(lineEdits[4]->text());
  output.append(listaUID);
  bigEditor->setText(output);

  QString trimeada = listaUID.trimmed();
  if (!trimeada.isEmpty()) {
    QStringList list2;
    if (trimeada.contains(" ", Qt::CaseInsensitive)) {
      list2 = trimeada.split(" ", QString::SkipEmptyParts);
      string terminosVarios;
      for (int i = 0; i < list2.size(); i++) {
        QString uno = list2.at(i);
        terminosVarios = uno.toStdString();
        long mailId = atol(terminosVarios.c_str());
        if (mailId > 0 && mi.EliminarMail(mailId)) {
          bigEditor->append(uno += " fue eliminado correctamente.");
        } else {
          bigEditor->append(uno += " no es un ID valido.");
        }
      }
    } else {
      string terminoUnico = trimeada.toStdString();
      long mailId = atol(terminoUnico.c_str());
      if (mailId > 0 && mi.EliminarMail(mailId)) {
        bigEditor->append(trimeada += " fue eliminado correctamente.");
      } else {
        bigEditor->append(trimeada += " no es un ID valido.");
      }
    }
    output.clear();
    output.append("Operacion finalizada.");
    bigEditor->append(output);
  } else {
    bigEditor->setText("Debe ingresar al menos un ID de mail.");
  }
}

void Dialog::verClick() {
  ManejadorInstrucciones mi;
  QString mailMostrado;
  mailMostrado = lineEdits[4]->text();
  QString idsTrimeados = mailMostrado.trimmed();
  if (!idsTrimeados.isEmpty()) {
    QStringList list2;
    if (idsTrimeados.contains(" ", Qt::CaseInsensitive)) {
      list2 = idsTrimeados.split(" ", QString::SkipEmptyParts);
      for (int i = 0; i < list2.size(); i++) {
        string posibleId = list2.at(i).toStdString();
        long id = atol(posibleId.c_str());
        mailMostrado += "\n\n";
        mi.MostrarMail(id, mailMostrado);
      }
    } else {
      string posibleId = idsTrimeados.toStdString();
      long id = atol(posibleId.c_str());
      mailMostrado += "\n";
      mi.MostrarMail(id, mailMostrado);
    }
    DialogMail dialogMail(mailMostrado, false);
    dialogMail.exec();
  } else {
    bigEditor->setText("Debe ingresar al menos un ID de mail para ver.");
  }
  bigEditor->setText("Operacion realizada con exito.");
}

void Dialog::mostrarDiccionarioClick() {
  ManejadorInstrucciones mi;
  QString diccionario;
  diccionario = "Diccionario de terminos:";
  diccionario += "\n";
  mi.MostrarDiccionario(diccionario);
  DialogMail dialogMail(diccionario, true);
  dialogMail.exec();
}

void Dialog::buscarTerminoClick() {
  ManejadorInstrucciones mi;
  Parser parser;
  vector<string> terminos;
  QString textoBuscado;
  QString output;
  output.append("Busco el(los) termino(s): ");
  textoBuscado.clear();
  textoBuscado.append(lineEdits[3]->text());
  QString trimeada = textoBuscado.trimmed();
  if (!trimeada.isEmpty()) {
    vector<ModeloDocumento> resultados;
    QStringList list2;
    if (trimeada.contains(" ", Qt::CaseInsensitive)) {
      list2 = trimeada.split(" ", QString::SkipEmptyParts);
      string terminosVarios;
      for (int i = 0; i < list2.size(); i++) {
        QString uno = list2.at(i);
        terminosVarios = uno.toStdString();
        output.append(uno += " ");
        parser.upper(terminosVarios);
        terminos.push_back(terminosVarios);
        resultados = mi.buscarTermino(terminos);
      }
    } else {
      output.append(trimeada);
      string terminoUnico = trimeada.toStdString();
      parser.upper(terminoUnico);
      terminos.push_back(terminoUnico);
      resultados = mi.buscarTermino(terminos);
    }
    bigEditor->setText(output);
    if (resultados.size() > 0) {
      QString encontrados = "Los IDs de los mails en que se encontro son:";
      bigEditor->append(encontrados);
      encontrados.clear();
      for (unsigned int i = 0; i < resultados.size(); i++) {
        encontrados += QString("%1; ").arg(resultados[i].idMail);
      }
      bigEditor->append(encontrados);
    } else {
      QString encontrados = "No se encontraron documentos.";
      bigEditor->append(encontrados);
    }
  } else {
    bigEditor->setText("Debe ingresar al menos un termino.");
  }
}

void Dialog::buscarFraseClick() {
  ManejadorInstrucciones mi;
  Parser parser;
  QString textoBuscado;
  QString frase;
  textoBuscado.append("Busco la frase: ");
  frase.append(lineEdits[3]->text());

  QString trimeada = frase.trimmed();
  if (!frase.isEmpty()) {
    vector<ModeloDocumento> resultados;
    QStringList list2;
    if (trimeada.contains(" ", Qt::CaseInsensitive)) {
      list2 = trimeada.split(" ", QString::SkipEmptyParts);
      if (list2.size() > 1) {
        vector<PalabraPos> terminos;
        string termino;
        for(int i = 0; i < list2.size(); i++) {
          termino = list2.at(i).toStdString();
          textoBuscado.append(list2.at(i));
          textoBuscado.append(" ");
          parser.upper(termino);
          PalabraPos palabraPos(termino, i);
          terminos.push_back(palabraPos);
        }
        bigEditor->setText(textoBuscado);
        vector<ModeloDocumento> resultados = mi.buscarFrase(terminos);
        if (resultados.size() > 0) {
          QString encontrados = "Los IDs de los mails en que se encontro son:";
          bigEditor->append(encontrados);
          encontrados.clear();
          for (unsigned int i = 0; i < resultados.size(); i++) {
            encontrados += QString("%1; ").arg(resultados[i].idMail);
          }
          bigEditor->append(encontrados);
        } else {
          QString encontrados = "No se encontraron documentos.";
          bigEditor->append(encontrados);
        }
      }
    } else {
      QString encontrados = "Una frase es una construccion de mas de una palabra.";
      bigEditor->setText(encontrados);
    }
  } else {
    QString encontrados = "Debe ingresar una frase en el campo de busqueda.";
    bigEditor->setText(encontrados);
  }
}

void Dialog::resguardarClick() {
  QString mensajeUsuario;
  ManejadorInstrucciones mi;
  QString username;
  username.append(lineEdits[0]->text());
  QString userTrimeado = username.trimmed();
  QString password;
  password.append(lineEdits[1]->text());
  QString passwordTrimeado = password.trimmed();
  if (userTrimeado.isEmpty() || passwordTrimeado.isEmpty()) {
    bigEditor->setText("ATENCION! Debe ingresar su nombre de usuario y clave para bajar mails.");
    return;
  }
  mensajeUsuario = "Descargando mails: ";
  mensajeUsuario.append(lineEdits[0]->text());
  bigEditor->setText(mensajeUsuario);
  mensajeUsuario = "En progreso, aguarde mensaje de finalizacion...";
  bigEditor->append(mensajeUsuario);
  QCoreApplication::processEvents();
  bool exito = mi.almacenamiento(bigEditor);
  if (exito) {
    mensajeUsuario.clear();
    mensajeUsuario = "La operacion finalizo con exito!";
    bigEditor->append(mensajeUsuario);
  }
}

void Dialog::configurarClick() {
  ManejadorInstrucciones mi;
  QString output;
  QString username;
  username.append(lineEdits[0]->text());
  QString userTrimeado = username.trimmed();
  QString password;
  password.append(lineEdits[1]->text());
  QString passwordTrimeado = password.trimmed();
  if (userTrimeado.isEmpty() || passwordTrimeado.isEmpty()) {
    bigEditor->setText("ATENCION! Debe ingresar su nombre de usuario y clave para crear indices.");
    return;
  }

  QString config;
  config.append(lineEdits[2]->text());

  QString trimeada = config.trimmed();
  if (!trimeada.isEmpty()) {
    QStringList list2;
    if (trimeada.contains(";", Qt::CaseInsensitive)) {
      list2 = trimeada.split(";", QString::SkipEmptyParts);
      for (int i = 0; i < list2.size(); i++) {
        QString uno = list2.at(i);
        if (uno.contains("=", Qt::CaseInsensitive) &&
            uno.contains("[", Qt::CaseInsensitive)) {
          QString indice;
          indice += userTrimeado;
          indice += QString(" ");
          indice += QString("crearseleccion");
          indice += QString(" ");
          indice += uno;
          output += mi.derivarCreacionIndices(indice);
          output += QString("\n");
        } else if (!uno.contains("=", Qt::CaseInsensitive) &&
            uno.contains("[", Qt::CaseInsensitive)) {
          QString indice;
          indice += userTrimeado;
          indice += QString(" ");
          indice += QString("crearclasificacion");
          indice += QString(" ");
          indice += uno;
          output += mi.derivarCreacionIndices(indice);
          output += QString("\n");
        }
      }
    } else {
      if (trimeada.contains("=", Qt::CaseInsensitive) &&
          trimeada.contains("[", Qt::CaseInsensitive)) {
        QString indice;
        indice += userTrimeado;
        indice += QString(" ");
        indice += QString("crearseleccion");
        indice += QString(" ");
        indice += trimeada;
        output += mi.derivarCreacionIndices(indice);
        output += QString("\n");
      } else if (!trimeada.contains("=", Qt::CaseInsensitive) &&
          trimeada.contains("[", Qt::CaseInsensitive)) {
        QString indice;
        indice += userTrimeado;
        indice += QString(" ");
        indice += QString("crearclasificacion");
        indice += QString(" ");
        indice += trimeada;
        output += mi.derivarCreacionIndices(indice);
        output += QString("\n");
      }
    }
  }
  bigEditor->setText(output);
}

void Dialog::clasificarClick(QString texto) {
  QString tag;
  tag.append(lineEdits[2]->text());
  tag.append("[");
  texto = texto.toUpper();
  tag.append(texto);
  tag.append("]");
  tag.append(";");
  lineEdits[2]->setText(tag);
}

void Dialog::seleccionarClick(QString texto) {
  QString tag;
  tag.append(lineEdits[2]->text());
  tag.append("[");
  texto = texto.toUpper();
  tag.append(texto);
  lineEdits[2]->setText(tag);
  bigEditor->setText("IMPORTANTE: Complete con un valor entre las comillas o"
      " inmediatamente despues del igual su indice de seleccion.");
  if (texto.compare(QString("ORIGEN")) == 0) {
    tag.append("=]");
    tag.append(";");
    lineEdits[2]->setText(tag);
    bigEditor->append("Ej.: [ORIGEN=datos.2c2010@gmail.com]");
  } else if (texto.compare(QString("DESTINO")) == 0) {
    tag.append("=]");
    tag.append(";");
    lineEdits[2]->setText(tag);
    bigEditor->append("Ej.: [DESTINO=datos.2c2010@gmail.com]");
  } else if (texto.compare(QString("FECHA")) == 0) {
    tag.append("=]");
    tag.append(";");
    lineEdits[2]->setText(tag);
    bigEditor->append("Ej.: [FECHA=15*sep*2010]");
  } else {
    tag.append("=]");
    tag.append(";");
    lineEdits[2]->setText(tag);
    bigEditor->append("Ej.: [ASUNTO=asunto*de*su*mail]");
  }
}
